<html>
	<head>
		<meta charset="utf-8"></meta>
		<title>BObject</title>
		<link href="./style.css" rel="stylesheet" type="text/css"/>
	</head>
	<body>
		<div class="class" name="BObject">
			<h1>BObject</h1>
			<p>继承自<a href="BThing.html">BThing</a></p>
			<p id="resume">BObject是面向对象编程的核心类，它提供了属性和信号槽机制，是很多类的基类。<a href="#desc">详细</a></p>
			<h2>public</h2>
			<table id="public">
				<tr><td align="right"/><td><a href="#BObject()">BObject</a>();</td></tr>
				<tr><td align="right"/><td><a href="#BObject(const BString&)">BObject</a>(const BString& name);</td></tr>
				<tr><td align="right"/><td><a href="#BObject(const BObject&)">BObject</a>(const BObject& other);</td></tr>
				<tr><td align="right"/><td><a href="#~BObject()">~BObject</a>();</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#setName(const BString&)">setName</a>(const BString& name);</td></tr>
				<tr><td align="right">const BString&amp; </td><td><a href="#name() const">name</a>() const;</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#setEnabled(bool)">setEnabled</a>(bool enabled);</td></tr>
				<tr><td align="right">bool </td><td><a href="#enabled() const">enabled</a>() const;</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#setAsset(const BValue&)">setAsset</a>(const BValue& asset);</td></tr>
				<tr><td align="right">const BValue&amp; </td><td><a href="#asset() const">asset</a>() const;</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#setProperty(const BString&, const BValue&)">setProperty</a>(const BString& name, const BValue& value);</td></tr>
				<tr><td align="right">const BValue&amp; </td><td><a href="#property(const BString&) const">property</a>(const BString& name) const;</td></tr>
				<tr><td align="right">const BValue&amp; </td><td><a href="#property(const char*) const">property</a>(const char* name) const;</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#input(const BString&, const BValue&)">input</a>(const BString& text, const BValue& value);</td></tr>
				<tr><td align="right">virtual bool </td><td><a href="#query(const BString&, BValue&) const">query</a>(const BString& text, BValue& value) const;</td></tr>
				<tr><td align="right">const BValue&amp; </td><td><a href="#query(const BString&) const">query</a>(const BString& text) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#mered(const char*) const">mered</a>(const char* type) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#mered(const BString&) const">mered</a>(const BString& type) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#typed(const char*) const">typed</a>(const char* type) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#typed(const BString&) const">typed</a>(const BString& type) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#lock() const">lock</a>() const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#unlock() const">unlock</a>() const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#trylock() const">trylock</a>() const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#wait(int,BReal)">wait</a>(int signal, BReal timeout = 10);</td></tr>
				<tr><td align="right">bool </td><td><a href="#wait(const char*,BReal)">wait</a>(const char* signal, BReal timeout = 10);</td></tr>
				<tr><td align="right">bool </td><td><a href="#wait(const BString&,BReal)">wait</a>(const BString& signal, BReal timeout = 10);</td></tr>
			</table>
			<h2>protected</h2>
			<table id="protected">
				<tr><td align="right">bool </td><td><a href="#checks(int) const">checks</a>(int signal) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#checks(const char*) const">checks</a>(const char* signal) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#checks(const BString&) const">checks</a>(const BString& signal) const;</td></tr>
			</table>
			<h2>protected</h2>
			<table id="protected">
				<tr><td align="right">bool </td><td><a href="#connect(int, METHOD)">connect</a>(int signal, METHOD method);</td></tr>
				<tr><td align="right">bool </td><td><a href="#connect(BObject*, int, METHOD)">connect</a>(BObject* object, int signal, METHOD method);</td></tr>
				<tr><td align="right">bool </td><td><a href="#connect(const BString&, METHOD)">connect</a>(const BString& signal, METHOD method);</td></tr>
				<tr><td align="right">bool </td><td><a href="#connect(BObject*, const BString&, METHOD)">connect</a>(BObject* object, const BString& signal, METHOD method);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(int)">disconnect</a>(int signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(const char*)">disconnect</a>(const char* signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(const BString&)">disconnect</a>(const BString& signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(BObject*)">disconnect</a>(BObject* object);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(BObject*, int)">disconnect</a>(BObject* object, int signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(BObject*, const char*)">disconnect</a>(BObject* object, const char* signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#disconnect(BObject*, const BString&)">disconnect</a>(BObject* object, const BString& signal);</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(int,const BValue&) const">emit</a>(int signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(const char*,const BValue&) const">emit</a>(const char* signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(const BString&,const BValue&) const">emit</a>(const BString& signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(BObject*, int,const BValue&) const">emit</a>(BObject* object, int signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(BObject*, const char*,const BValue&) const">emit</a>(BObject* object, const char* signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#emit(BObject*, const BString&,const BValue&) const">emit</a>(BObject* object, const BString& signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(int,const BValue&) const">post</a>(int signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(const char*,const BValue&) const">post</a>(const char* signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(const BString&,const BValue&) const">post</a>(const BString& signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(BObject*, int,const BValue&) const">post</a>(BObject* object, int signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(BObject*, const char*,const BValue&) const">post</a>(BObject* object, const char* signal, const BValue& value = BValue()) const;</td></tr>
				<tr><td align="right">bool </td><td><a href="#post(BObject*, const BString&,const BValue&) const">post</a>(BObject* object, const BString& signal, const BValue& value = BValue()) const;</td></tr>
			</table>
			<h2>public</h2>
			<table id="public">
				<tr><td align="right">inline </td><td><a href="#AutoLock(const BObject*)">AutoLock</a>(const BObject* obj);</td></tr>
				<tr><td align="right">inline </td><td><a href="#~AutoLock()">~AutoLock</a>();</td></tr>
			</table>
			<div id="desc">
				<h2>详细介绍：</h2>
				<p>BObject是面向对象编程的核心类，它提供了属性和信号槽机制，是很多类的基类。</p>
				<p>BObject为框架提供了信号槽机制，使用connect()和disconnect()方法对关心的信号进行连接或断开。当连接成功后，每当特定的信号发生对应的方法就会被调用。对象自身也可以发出信号，使用emit()发送即时信号，发送后相关处理槽会被立即执行。若是使用post发出则是邮寄信号，会在下一个运行周期被传递到处理槽。</p><p>信号值可以是整数值，也可以是字符串。在框架内部全部使用整数值，其优点是高效。字符串为信号值一般在应用开发时使用，相较于整数值字符串信号非常灵活，在团队合作时不需要共享信号定义文件，只需要相互间都认可信号名称即可使用。</p><p>槽方法的定义规则是必须是对象的方法，不可以是全局函数，并且最多可以有两个参数。方法格式如下：<br/><pre>void slotMyProcMehtod(BObject* object, const BValue& value);
方法应当无返回值，因为不会对其处理所以不返回值是建议的。方法第一个参数是信号的发送者，它是一个对象指针，但不规定类型，也不规定访问限制，因为C++没有办法实现这个要求。第二个参数是信号携带的一个值BValue，因为其强大特性此值可以表示任何东西。</pre>
				</p><p>一个对象可以拥有名称，它也可以有核心资产asset。另外为了更加灵活其还可以有命名属性name:property。</p>
				<p>对象还自带线程互斥功能，在任何地方使用lock(),trylock()和unlock()方法即可对此对象进行锁定和解锁。</p><p>当一个类继承自BObject那么请优先考虑使用预置宏BOBJECT()，一般都放在类定义的开始处。这个宏会为其引用核心特性，包括类型列表和隐式成员指针。类型列表记录所有父类类型名称。示例如下：<br/><pre>class MyClass : public BObject
{
	BOBJECT(MyClass)
}；
int main()
{
	MyClass mc;
	for(int i = 0; i < mc.typeCount(); i++)
	{
		const char* type = mc.typeName(i);
		puts(type);
	}
}

上面的代码将会输出mc对象的所有类型。</pre>
					<br/>
				</p><p>信号：<br/>
					<table>
						<tr><td>Signal_Renamed</td><td>名称改变时发出，数值是const BString&amp; name。</td></tr>
						<tr><td>Signal_Enabled</td><td>启动状态改变时发出，数值是bool enabled。</td></tr>
						<tr><td>Signal_AssetChanged</td><td>资产改变时发出，数值是const BValue&amp; asset。</td></tr>
						<tr><td>Signal_PropertyChanged</td><td>属性表被改变时发出，数值是const BString&amp; propertyName。</td></tr></table></p>
			</div>
			<h2 id="docs">成员文档：</h2>
			<div id="BObject()">
				<h3>BObject();</h3>
				<p>构建一个对象。</p>
			</div>
			<div id="BObject(const BString&)">
				<h3>BObject(const BString&amp; name);</h3>
				<p>构建一个对象，并指定其名称。</p>
				<p>参考 :<a href="#setName(const BString&)">setName</a></p>
			</div>
			<div id="BObject(const BObject&)">
				<h3>BObject(const BObject&amp; other);</h3>
				<p>构建一个对象，并从另一个对象身上获取数据。</p>
			</div>
			<div id="~BObject()">
				<h3>~BObject();</h3>
				<p>析构对象。此方法会释放掉类型列表的内存空间，注意其不会对联接的信号进行断开。</p>
			</div>
			<div id="setName(const BString&)">
				<h3>virtual bool setName(const BString&amp; name);</h3>
				<p>设置对象名称，并发出信号Signal_Rename，值是名称字符串。</p>
			</div>
			<div id="name() const">
				<h3>const BString&amp; name() const;</h3>
				<p>获取对象名称。</p>
			</div>
			<div id="setEnabled(bool)">
				<h3>virtual bool setEnabled(bool enabled);</h3>
				<p>设置此对象是否启用的状态，此状态在部分情况下会被在意，如场景中对象是否要进行更新等等。</p>
			</div>
			<div id="enabled() const">
				<h3>bool enabled() const;</h3>
				<p>获取当前对象是否启用状态。</p>
			</div>
			<div id="setAsset(const BValue&)">
				<h3>virtual bool setAsset(const BValue&amp; asset);</h3>
				<p>设置对象的资产值，并发出信号Signal_AssetChanged，值是资产值。资产值建议是此对象最关注的核心值，次要的值可以使用属性的方式管理。</p>
			</div>
			<div id="asset() const">
				<h3>const BValue&amp; asset() const;</h3>
				<p>获取对象的资产值。</p>
			</div>
			<div id="setProperty(const BString&, const BValue&)">
				<h3>virtual bool setProperty(const BString&amp; name, const BValue&amp; value);</h3>
				<p>设置对象的属性值，name参数指定要修改的属性名称，value是要应用的值。</p>
			</div>
			<div id="property(const BString&) const">
				<h3>const BValue&amp; property(const BString&amp; name) const;</h3>
				<p>获取指定名称的属性值。</p>
			</div>
			<div id="property(const char*) const">
				<h3>const BValue&amp; property(const char* name) const;</h3>
				<p>获取指定名称的属性值。</p>
			</div>
			<div id="input(const BString&, const BValue&)">
				<h3>virtual bool input(const BString&amp; text, const BValue&amp; value);</h3>
				<p>输入方法，此方法用于在现有方法不够丰富时进行补充，重写此方法可以在不确定对象类型的情况下对其进行操作。</p>
			</div>
			<div id="query(const BString&, BValue&) const">
				<h3>virtual bool query(const BString&amp; text, BValue&amp; value) const;</h3>
				<p>查寻方法，此方法用于在现有查寻方法不够丰富时进行补充，常常被重写用于获取对象内部特殊数据。</p>
			</div>
			<div id="query(const BString&) const">
				<h3>const BValue&amp; query(const BString&amp; text) const;</h3>
				<p>此方法作为上面查寻方法的封装，更加简洁，但会生成并释放临时值。</p>
			</div>
			<div id="mered(const char*) const">
				<h3>bool mered(const char* type) const;</h3>
				<p>判断对象是否最终名称为指定的类型名。如一个对象类型为：BObject,BShape,BGeometry，此方法会判断对象是否为BGeometry类型，而不在意前面的类型。可见此方法用于确定对象的实际类型。</p>
			</div>
			<div id="mered(const BString&) const">
				<h3>bool mered(const BString&amp; type) const;</h3>
				<p>判断对象是否最终名称为指定的类型名。如一个对象类型为：BObject,BShape,BGeometry，此方法会判断对象是否为BGeometry类型，而不在意前面的类型。可见此方法用于确定对象的实际类型。</p>
			</div>
			<div id="typed(const char*) const">
				<h3>bool typed(const char* type) const;</h3>
				<p>判断对象是否属有指定的类型，只要其类是继承自指定类型都是可以的。</p>
			</div>
			<div id="typed(const BString&) const">
				<h3>bool typed(const BString&amp; type) const;</h3>
				<p>判断对象是否属有指定的类型，只要其类是继承自指定类型都是可以的。</p>
			</div>
			<div id="lock() const">
				<h3>bool lock() const;</h3>
				<p>锁定此对象，锁定操作不成功就阻塞等待，直到锁定成功为止才返回。锁定失败时返回false。</p>
			</div>
			<div id="unlock() const">
				<h3>bool unlock() const;</h3>
				<p>解锁此对象，解锁操作会阻塞直到成功。解锁失败时返回false。</p>
			</div>
			<div id="trylock() const">
				<h3>bool trylock() const;</h3>
				<p> 尝试锁定此对象，如果当下不可以锁定就立刻返回false，不作片刻停留。 
				</p>
			</div>
			<div id="wait(int,BReal)">
				<h3>bool wait(int signal, BReal timeout = 10);</h3>
			</div>
			<div id="wait(const char*,BReal)">
				<h3>bool wait(const char* signal, BReal timeout = 10);</h3>
			</div>
			<div id="wait(const BString&,BReal)">
				<h3>bool wait(const BString&amp; signal, BReal timeout = 10);</h3>
			</div>
			<div id="checks(int) const">
				<h3>bool checks(int signal) const;</h3>
			</div>
			<div id="checks(const char*) const">
				<h3>bool checks(const char* signal) const;</h3>
			</div>
			<div id="checks(const BString&) const">
				<h3>bool checks(const BString&amp; signal) const;</h3>
			</div>
			<div id="connect(int, METHOD)">
				<h3>bool connect(int signal, METHOD method);</h3>
				<p>此方法没有指定信号的发出对象，所以是对所有对象发出的信号进行联接，signal是信号值，method为处理信号的槽方法。</p>
			</div>
			<div id="connect(BObject*, int, METHOD)">
				<h3>bool connect(BObject* object, int signal, METHOD method);</h3>
				<p>联接指定对象发出的信号，object指定信号发出者，signal是信号值，method为处理信号的槽方法。</p>
			</div>
			<div id="connect(const BString&, METHOD)">
				<h3>bool connect(const BString&amp; signal, METHOD method);</h3>
				<p>此方法没有指定信号的发出对象，所以是对所有对象发出的信号进行联接，signal是信号字符串，method为处理信号的槽方法。</p>
			</div>
			<div id="connect(BObject*, const BString&, METHOD)">
				<h3>bool connect(BObject* object, const BString&amp; signal, METHOD method);</h3>
				<p>联接指定对象发出的信号，object指定信号发出者，signal是信号字符串，method为处理信号的槽方法。</p>
			</div>
			<div id="disconnect(int)">
				<h3>bool disconnect(int signal);</h3>
				<p>断开指定信号相关的联接。</p>
			</div>
			<div id="disconnect(const char*)">
				<h3>bool disconnect(const char* signal);</h3>
				<p>断开指定信号相关的联接。</p>
			</div>
			<div id="disconnect(const BString&)">
				<h3>bool disconnect(const BString&amp; signal);</h3>
				<p>断开指定信号相关的联接。</p>
			</div>
			<div id="disconnect(BObject*)">
				<h3>bool disconnect(BObject* object);</h3>
				<p>断开指定对象发出的一切信号联接。</p>
			</div>
			<div id="disconnect(BObject*, int)">
				<h3>bool disconnect(BObject* object, int signal);</h3>
				<p>断开指定对象发出的某个信号联接，object是信号发出者，signal是信号值。</p>
			</div>
			<div id="disconnect(BObject*, const char*)">
				<h3>bool disconnect(BObject* object, const char* signal);</h3>
				<p>断开指定对象发出的某个信号联接，object是信号发出者，signal是信号字符串。</p>
			</div>
			<div id="disconnect(BObject*, const BString&)">
				<h3>bool disconnect(BObject* object, const BString&amp; signal);</h3>
				<p>断开指定对象发出的某个信号联接，object是信号发出者，signal是信号字符串。</p>
			</div>
			<div id="emit(int,const BValue&) const">
				<h3>bool emit(int signal, const BValue&amp; value = BValue()) const;</h3>
				<p>发出一个信号，signal是信号值，value是信号携带的值。</p>
			</div>
			<div id="emit(const char*,const BValue&) const">
				<h3>bool emit(const char* signal, const BValue&amp; value = BValue()) const;</h3>
				<p>发出一个信号，signal是信号名称，value是信号携带的值。</p>
			</div>
			<div id="emit(const BString&,const BValue&) const">
				<h3>bool emit(const BString&amp; signal, const BValue&amp; value = BValue()) const;</h3>
				<p>发出一个信号，signal是信号名称，value是信号携带的值。</p>
			</div>
			<div id="emit(BObject*, int,const BValue&) const">
				<h3>bool emit(BObject* object, int signal, const BValue&amp; value = BValue()) const;</h3>
				<p>只向指定的对象发出一个信号，signal是信号值，value是信号携带的值。其它对象即使联接了此信号也接收不到。</p>
			</div>
			<div id="emit(BObject*, const char*,const BValue&) const">
				<h3>bool emit(BObject* object, const char* signal, const BValue&amp; value = BValue()) const;</h3>
				<p>向指定的对象发出一个信号，signal是信号名称，value是信号携带的值。其它对象即使联接了此信号也接收不到。</p>
			</div>
			<div id="emit(BObject*, const BString&,const BValue&) const">
				<h3>bool emit(BObject* object, const BString&amp; signal, const BValue&amp; value = BValue()) const;</h3>
				<p>向指定的对象发出一个信号，signal是信号名称，value是信号携带的值。其它对象即使联接了此信号也接收不到。</p>
			</div>
			<div id="post(int,const BValue&) const">
				<h3>bool post(int signal, const BValue&amp; value = BValue()) const;</h3>
				<p>邮寄一个信号，signal是信号值，value是信号携带的值。</p>
			</div>
			<div id="post(const char*,const BValue&) const">
				<h3>bool post(const char* signal, const BValue&amp; value = BValue()) const;</h3>
				<p>邮寄一个信号，signal是信号名称，value是信号携带的值。</p>
			</div>
			<div id="post(const BString&,const BValue&) const">
				<h3>bool post(const BString&amp; signal, const BValue&amp; value = BValue()) const;</h3>
				<p>邮寄一个信号，signal是信号名称，value是信号携带的值。</p>
			</div>
			<div id="post(BObject*, int,const BValue&) const">
				<h3>bool post(BObject* object, int signal, const BValue&amp; value = BValue()) const;</h3>
				<p>向指定的对象邮寄一个信号，signal是信号值，value是信号携带的值。其它对象即使联接了此信号也收不到。</p>
			</div>
			<div id="post(BObject*, const char*,const BValue&) const">
				<h3>bool post(BObject* object, const char* signal, const BValue&amp; value = BValue()) const;</h3>
				<p>向指定的对象邮寄一个信号，signal是信号名称，value是信号携带的值。其它对象即使联接了此信号也收不到。</p>
			</div>
			<div id="post(BObject*, const BString&,const BValue&) const">
				<h3>bool post(BObject* object, const BString&amp; signal, const BValue&amp; value = BValue()) const;</h3>
				<p>向指定的对象邮寄一个信号，signal是信号名称，value是信号携带的值。其它对象即使联接了此信号也收不到。</p>
			</div>
			<div id="AutoLock(const BObject*)">
				<h3>inline AutoLock(const BObject* obj);</h3>
			</div>
			<div id="~AutoLock()">
				<h3>inline ~AutoLock();</h3>
			</div>
		</div>
	</body>
</html>